import axios from 'axios'
import { createUniAppAxiosAdapter } from '@uni-helper/axios-adapter'
import { httpLogError, requestError, throttleToLogin } from './utils'
import { useOutsideLoadingStore } from '@/store/loading'
import tool from '@/utils/tool'
import sysConfig from '@/config/index'
import { ref } from 'vue'

const loading = useOutsideLoadingStore()
// 以下这些code需要重新登录
const reloadCodes = [401, 1011007, 1011008]
const errorCodeMap = {
	400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
	401: '用户没有权限（令牌、用户名、密码错误）。',
	403: '用户得到授权，但是访问是被禁止的。',
	404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
	406: '请求的格式不可得。',
	410: '请求的资源被永久删除，且不会再得到的。',
	422: '当创建一个对象时，发生一个验证错误。',
	500: '服务器发生错误，请检查服务器。',
	502: '网关错误。',
	503: '服务不可用，服务器暂时过载或维护。',
	504: '网关超时。'
}
// 定义一个重新登录弹出窗的变量
const loginBack = ref(false)
export function createService() {
  const request = axios.create({ 
    baseURL: import.meta.env.VITE_APP_API_BASEURL, // 所有通过此配置的基础地址 在.env文件配置
    timeout: 15000, // 请求超时时间
    adapter: createUniAppAxiosAdapter() 
  })

  request.interceptors.request.use(
    (request) => {
      const token = tool.data.get('TOKEN')
      if(token) {
        request.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token
      }
      if(!sysConfig.REQUEST_CACHE && request.method === 'get'){
        request.params = request.params || {}
        request.params._ = new Date().getTime()
      }
      Object.assign(request.headers, sysConfig.HEADERS)
      return request
    },
    (err) => {
      return Promise.reject(err)
    }
  )

  request.interceptors.response.use(
    (response) => {
      loading.hideLoading()
      if(response.config.responseType === 'blob') {
        if(response.status === 200) {
          return response
        } else {
          return uni.showToast({title:'文件下载失败', icon: 'error'})
        }
      }
      

      const dataAxios = response.data
      console.log(dataAxios)
      // 这个状态码是和后端约定的
      const { code, data, msg } = dataAxios
      if(code === undefined){
        return dataAxios
      }
      if(reloadCodes.includes(code)){
        if(!loginBack.value){
          throttleToLogin(loginBack)
        }
        return
      }

      if(code !== 200) {			
        // 自定义错误提示，覆盖后端返回的message
        // 使用示例：
        // export function customerList (data) {
        //   return request('list', data, 'get', {
        //     customErrorMessage: '自定义错误消息提示'
        //   });
        // }
        const customErrorMessage = response.config.customErrorMessage
        uni.showToast({title:customErrorMessage || msg, icon: 'error'})
        return Promise.reject(data)
      } else {
        // 统一成功提示
        const responseUrls = response.config.url.split('/')
        const apiNameArray = [
          'add',
          'edit',
          'delete',
          'update',
          'grant',
          'reset',
          'stop',
          'pass',
          'disable',
          'enable',
          'revoke',
          'suspend',
          'active',
          'turn',
          'adjust',
          'reject',
          'saveDraft'
        ]
        apiNameArray.forEach((apiName) => {
          if (responseUrls[responseUrls.length - 1] === apiName) {
            uni.showToast({title:msg, icon:'success'})
          }
        })
      }
      return Promise.resolve(data)
    },
    (error) => {
      console.log(error)
      loading.hideLoading()
      if(error) {
        const status = error.response?.status || 503
        const description = errorCodeMap[status]
        console.error({
          message: '请求错误',
          description: description || error.response?.message || ''
        })
        uni.showToast({title: description || error.response?.message || '', icon: 'error'})
        return Promise.reject(status)
      }
      return Promise.reject(error)
    }
  )
  
  return request
}

export const service = createService()
